/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transactions;

import data.FilterDO;
import data.FilterData;
import java.util.LinkedList;
import utils.Tabelas;
import utils.Transaction;

/**
 *
 * @author Felipe
 */
public class Filter {

    public static String getQueryToFindUsers(int pesquisa_id) {
        String sql = "SELECT " + "*" + " FROM " + Tabelas.USER;
        LinkedList<FilterDO> lista = buscar(pesquisa_id);
        // Se algum filtro para essa pesquisa
        if (lista != null) {
            if (lista.size() > 0) {
                String s;
                boolean addAND = false;
                //ddd
                s = getPartialQuery(lista, Tabelas.USER_ddd, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //tipo_moradia
                s = getPartialQuery(lista, Tabelas.USER_moradia, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //sexo
                s = getPartialQuery(lista, Tabelas.USER_sexo, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //estado_civil
                s = getPartialQuery(lista, Tabelas.USER_estado_civil, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //profissao
                s = getPartialQuery(lista, Tabelas.USER_profissao, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //educacao
                s = getPartialQuery(lista, Tabelas.USER_educacao, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //renda
                s = getPartialQuery(lista, Tabelas.USER_renda, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //n_pessoas_residencia
                s = getPartialQuery(lista, Tabelas.USER_n_pess_resd, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
                //idade
                s = getPartialQuery(lista, Tabelas.USER_idade, addAND);
                if (s.length() > 0) {
                    sql += s;
                    addAND = true;
                }
            }
        }
        sql += " ORDER BY " + Tabelas.USER_id + ";";
//        System.out.println(sql);
        return sql;
    }

    private static String getPartialQuery(LinkedList<FilterDO> lista, String campo, boolean addAND) {
        String s = "";
        //Cria uma nova lista
        LinkedList<FilterDO> lista_temp = new LinkedList<FilterDO>();
        //varre a lista passada como parametro e procura todas as entradas que filtram o campo
        for (FilterDO f : lista) {
            if (f.getUser_campo().trim().equalsIgnoreCase(campo)) {
                lista_temp.add(f);
            }
        }
        //remove essas entradas da lista anterior
        for (FilterDO f : lista_temp) {
            lista.remove(f);
        }
        //Compoe parte da query
        if (lista_temp.size() > 0) {
            String op, aux, aux2;
            aux = (lista_temp.getFirst().getOperacao() == '=' ? " OR " : " AND ");
            aux2 = (campo.equals(Tabelas.USER_estado_civil) ? "'" : "");
            if (campo.equals(Tabelas.USER_idade)) { //idade
                s += (addAND ? " AND" : " WHERE") + " ( ";
                for (FilterDO f : lista_temp) {
                    if (lista_temp.indexOf(f) > 0) {
                        s += " AND ";
                    }
                    if (f.getOperacao() == '>') {
                        s += "( DATEDIFF( CURDATE(), data_nasc)/365 > " + f.getValor() + " )";
                    }
                    if (f.getOperacao() == '<') {
                        s += "( DATEDIFF( CURDATE(), data_nasc)/365 < " + f.getValor() + " )";
                    }
                }
                s += " )";
            } else {//outros campos
                s += (addAND ? " AND" : " WHERE") + " ( ";
                for (FilterDO f : lista_temp) {
                    if (lista_temp.indexOf(f) > 0) {
                        s += aux;
                    }
                    s += campo + " " + (f.getOperacao() == '!' ? "<>" : f.getOperacao()) + " " + aux2 + f.getValor() + aux2;
                }
                s += " )";
            }
        }
        //Devolve parte da query
        return s;
    }

    protected static LinkedList<FilterDO> buscar(int pesquisa_id) {
        LinkedList<FilterDO> lista = null;
        Transaction tr = null;
        try {
            tr = new Transaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (tr != null) {
            try {
                lista = FilterData.buscar(pesquisa_id, tr);
                tr.commit();
                if (lista != null) {
                    for (FilterDO f : lista) {
                        System.out.println(f.getPesquisa_id() + "\t" + f.getUser_campo() + "\t" + f.getOperacao() + "\t" + f.getValor());
                    }
                }
                return lista;
            } catch (Exception e) {
                tr.rollback();
                e.printStackTrace();
            }
        }
        return null;
    } // buscar
}
